<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
       Promise.all 并行执行多个 new Promise() 对象，等待所有的 resolve，将所有 resolve(实参) 以数组的形式，收集到 then 回调函数的参数中
        ① 输入数组类型，数组的每个元素是 new Promise() 对象
        ② 输出 new Promise() 对象

      then 执行
      ① 所有的 resolve 都执行的情况下 then 才会执行
      ②  then 回调函数参数数组元素的顺序和 all 参数数组元素顺序一致

      catch 执行时机
      当任意一个 new Promise() 对象内部抛出异常就会立刻执行
       */
      const p1 = new Promise((resolve, reject) => {
        throw new Error("...1");
        setTimeout(() => {
          resolve(1);
        }, Math.random() * 1000);
      });
      const p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(2);
        }, Math.random() * 1000);
      });
      const p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(3);
          // reject(new Error("...3"));
        }, Math.random() * 1000);
      });
      Promise.all([p1, p2, p3])
        .then((data) => {
          console.log(data);
        })
        .catch((e) => {
          console.log("catch", e.message);
        });
    </script>
  </body>
</html>
